cash kit
setup worksheet · local only

Your money, on your Mac, nowhere else.

Seven steps, in order, each with the exact command to paste and what a good result looks like. Tick a step when it's done; this page remembers where you left off so you can close it and come back.

This page makes no network requests. It has no box for your SimpleFIN token, your bank passwords, or anything else secret — those are typed by you, into Terminal or into the bank-connection screen, and nowhere else.

0/7 steps done
saved in this browser, on this Mac
Read me first

What you're setting up, in one breath

cash-kit is a folder of small Python scripts on your Mac. Once a day it asks SimpleFIN Bridge for your balances and recent transactions, saves them as plain text files inside that folder, and draws two pages you open locally: today.html (where the money is and where it's heading over the next five months) and spend-calendar.html (what went out, day by day).

What leaves your Mac: one request a day, over https, to SimpleFIN Bridge, using an access key that only you hold. What never leaves: everything else. Not to whoever gave you this kit, not to Claude, not to any cloud. Your bank passwords go to SimpleFIN Bridge's own sign-in screen and never touch the kit at all.

Terminal, in three sentences

The kit folder lives at ~/git/cash-kit (that is, a git folder in your home folder, with cash-kit inside it). Every command on this page is ./cash-kit something, typed from inside that folder; Step 1 gets you there. If yours ends up somewhere else, Step 1 also shows how to point Terminal at it.

Step 1

Check your Mac

Confirms the Python that ships with macOS is new enough and that the kit is where we expect. Nothing to install.

What it does. cash-kit uses the Python already on every Mac (/usr/bin/python3) with nothing added — no pip, no Homebrew, no downloads. It needs version 3.9 or newer, which macOS 13 (Ventura, 2022) and later provide.

1a — Python version

Terminal
/usr/bin/python3 --version
What good looks like
Python 3.9.6      (3.9.anything or higher is fine — 3.11, 3.12, 3.13 all good)
If it goes wrong: a window pops up offering to install "command line developer tools" — click Install. That is Apple's own installer, it takes a few minutes, and then the command above works. If you see Python 3.8 or lower, your macOS is older than this kit expects; update macOS first (Apple menu → System Settings → General → Software Update).

1b — The kit folder

Put the kit at ~/git/cash-kit. If you were handed a zip, unzip it and drag the cash-kit folder into a folder called git in your home folder (Finder → Go → Home; make git if it isn't there). If you were given a git address instead, this does the same thing in one line — swap in the address you were given:

Terminal — replace <repo-url> with the address you were given
mkdir -p ~/git && cd ~/git && git clone <repo-url> cash-kit

Then step inside and ask the kit for its help text:

Terminal
cd ~/git/cash-kit
./cash-kit
What good looks like
cash-kit — your money, on your Mac, nowhere else.

  ./cash-kit claim                 one-time: link your SimpleFIN Bridge — paste the token at the hidden prompt
  ./cash-kit pull                  fetch balances + transactions into ledger/inbox
  ./cash-kit today                 render today.html
  ./cash-kit calendar              render spend-calendar.html
  ./cash-kit morning               pull + today + calendar (what the daily job runs)
  ./cash-kit ingest [--dry-run]    promote posted feed rows into ledger/transactions.csv
  ./cash-kit install               schedule 'morning' daily at 9:15 via launchd
  ./cash-kit open                  open today.html in your browser
  ./cash-kit status                show link + last pull
If it goes wrong:

No such file or directory — the folder isn't at ~/git/cash-kit. Type cd (with the space), then drag the cash-kit folder from Finder into the Terminal window, press return, then run ./cash-kit. Every later command on this page starts with cd ~/git/cash-kit; swap in your path each time, or simply move the folder to ~/git/cash-kit and be done with it.

Permission denied — run chmod +x ~/git/cash-kit/cash-kit ~/git/cash-kit/install.sh once, then try again.

Step 2

SimpleFIN Bridge — connect your banks, claim your token

The one outside party in this whole setup. $1.50 a month or $15 a year.

What it does. SimpleFIN Bridge is a small paid service that signs in to your banks on your behalf and hands out a read-only copy of balances and transactions. cash-kit never sees a bank password; it only ever talks to the Bridge, and only to read.

Sign up or sign in to SimpleFIN Bridge https://beta-bridge.simplefin.org

2a — Account and banks

  1. Create an account and pay. Your card details go to SimpleFIN's payment page, nobody else.
  2. Connect each bank: look for Add a connection (or similar), pick your bank, and sign in on the connection screen that appears (that screen belongs to MX, the aggregator SimpleFIN uses; it is the only place your bank password ever goes). If the bank sends you a text-message code, enter it there. Link the bank that holds your main checking account first — the daily page anchors on it. Then add the rest in any order: savings, cards, loans, brokerage. Not sure a bank is supported? Check https://beta-bridge.simplefin.org/search-institutions.

2b — Create an app and copy the Setup Token

  1. On your Bridge account page, find the section for apps (it may say New App or Create Setup Token); the direct address is https://beta-bridge.simplefin.org/simplefin/create. Name the app cash-kit.
  2. The Bridge shows one long block of letters and numbers. That is your Setup Token. Leave that browser tab open for a moment; you'll copy it in 2c.
The token is single-use, and you are the only one who ever types it.
  • It goes into your own Terminal, at the hidden prompt the command below opens. Not into this page (there is no box for it, on purpose), not into an email, not into a chat, not to whoever gave you this kit.
  • The moment cash-kit claims it, the token is spent. It turns into an access key that lands at ~/.config/cash-kit/simplefin_access_url — readable by your user only (chmod 600), and kept outside the kit folder so it can never be copied along with the folder.
  • If you ever mis-paste it, just make a new one on the Bridge site. Nothing breaks and nothing is exposed.

2c — Claim it

claim takes nothing on the command line. It asks for the token at a hidden prompt, so the token never shows on screen and never lands in your shell history.

  1. Copy the command below, paste it into Terminal, press return.
  2. Terminal answers with Paste your SimpleFIN setup token (input is hidden), then Enter: and waits.
  3. Go to the Bridge tab and copy the Setup Token. Click back into Terminal, press ⌘ V. Nothing appears on the line — that is expected. Press return.
Terminal
cd ~/git/cash-kit && ./cash-kit claim
What good looks like
Paste your SimpleFIN setup token (input is hidden), then Enter:
Stored access URL for beta-bridge.simplefin.org at /Users/you/.config/cash-kit/simplefin_access_url (chmod 600).
Claim successful. Next:  ./cash-kit pull

You can confirm the link any time (this never prints the key itself):

Terminal
cd ~/git/cash-kit
./cash-kit status
What good looks like
access URL: configured -> https://<redacted>@beta-bridge.simplefin.org/<path-redacted>
last pull:  never
seen ids:   0 posted, 0 pending
inbox pulls: none
If it goes wrong:

no token entered — you pressed return before pasting. Run the command again and paste at the prompt.

setup token is not valid base64 — the paste picked up a stray space or line break, or missed a piece. Make a new token at https://beta-bridge.simplefin.org/simplefin/create and try again (it costs nothing).

claim failed: HTTP 403 — setup tokens are single-use — that token was already used or has expired. Make a fresh one at the same address and run ./cash-kit claim again.

that looks like an ACCESS url, not a setup token — you copied a link rather than the token. The Setup Token is the long block of letters and numbers, no https:// in it.

Step 3

First pull — and name your accounts

Fetches the last 44 days into plain CSV files, then asks you what to call each account.

What it does. pull asks the Bridge for balances and transactions and writes them into ledger/inbox/ as dated CSV files: 2026-09-18-simplefin.csv (transactions), -balances.csv, and -holdings.csv if a brokerage account is linked. The first time, it doesn't know what you call your accounts, so it ends with a NEW ACCOUNTS FOUND block: a small piece of valid JSON listing each account it saw.

Terminal
cd ~/git/cash-kit
./cash-kit pull
What good looks like
Pulling since 2026-08-05 …

3 account(s); 212 new row(s) (4 pending), 0 already tracked.
  Big Bank Checking: $4812.55  (as of 2026-09-18)
  Big Bank Savings: $12040.00  (as of 2026-09-18)
  Card Co Visa: $-1318.22  (as of 2026-09-18)

Wrote: 2026-09-18-simplefin.csv  2026-09-18-simplefin-balances.csv

NEW ACCOUNTS FOUND. Paste this into accounts.json (valid JSON), then change each
right-hand name to what you want on the page (e.g. "Checking"), then run:
  ./cash-kit pull --fresh
{
  "ACT-0011aabb-ccdd-4eef-8899-776655443322": "Card Co Visa",
  "ACT-1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d": "Big Bank Checking",
  "ACT-9f8e7d6c-5b4a-4c3d-2e1f-0a9b8c7d6e5f": "Big Bank Savings"
}

Reading the block. Each line pairs an account id on the left (an opaque label the Bridge assigns; it is not a secret and unlocks nothing) with the name the bank gave the account on the right. Real ids look like ACT-…; SimpleFIN's demo account uses plain names such as Demo Checking. Either way, the id is copied exactly as printed. You change only the right-hand side, to the short name you'd like on your page: Checking, Savings, Visa. Short is good; you'll type these names again in Step 4, and they must match exactly.

If it stops early: token is valid, but NO banks are connected yet means the claim worked but nothing is linked to it. Sign in at https://beta-bridge.simplefin.org/auth/login, connect your checking bank (Step 2a), and pull again.

3a — Name each account

Shortcut: paste the NEW ACCOUNTS FOUND block here and let the page read the ids
The { … } part is enough. Adds a row per id, with the bank's name filled in for you to shorten.
Account id (exactly as the pull printed it)Name you want on the page
The ids and names are kept in this browser only.
No accounts yet

3b — Export accounts.json

What will be written
(name at least one account above)

3c — Save it into the kit folder

After Copy, this one line writes the clipboard straight into the file (pbpaste means "paste the clipboard", > means "into this file"):

Terminal
pbpaste > ~/git/cash-kit/accounts.json && cat ~/git/cash-kit/accounts.json
What good looks like
(it prints the file back to you — the same text as the preview above)

If you used Download instead, move it out of Downloads: mv ~/Downloads/accounts.json ~/git/cash-kit/

Prefer to do it by hand, without this page?

Start from the example file and open it in TextEdit: cd ~/git/cash-kit && cp accounts.example.json accounts.json && open -t accounts.json. Replace the example ACT-… line with the { … } block the pull printed, change each right-hand name, keep the quotes and commas as they were, save. Then carry on with 3d.

3d — Pull again with --fresh

The first pull filed everything under the banks' own names, and the kit remembers every transaction it has seen so it never writes a duplicate. --fresh makes it forget that first pull (the inbox feed files and the dedupe memory — never your access key) and fetch again under your names:

Terminal
cd ~/git/cash-kit
./cash-kit pull --fresh
What good looks like
fresh pull: cleared the dedupe state and the inbox feed files
Pulling since 2026-08-05 …

3 account(s); 212 new row(s) (4 pending), 0 already tracked.
  Checking: $4812.55  (as of 2026-09-18)
  Savings: $12040.00  (as of 2026-09-18)
  Visa: $-1318.22  (as of 2026-09-18)

Wrote: 2026-09-18-simplefin.csv  2026-09-18-simplefin-balances.csv
…and no NEW ACCOUNTS FOUND block at the end.
If it goes wrong:

token is valid, but NO banks are connected yet — the token is fine but nothing is linked. Sign in at https://beta-bridge.simplefin.org/auth/login, connect a bank, pull again.

HTTP 403 — access token rejected — make a fresh Setup Token at https://beta-bridge.simplefin.org/simplefin/create and re-run Step 2c.

WARNING: accounts.json is invalid JSON — ignoring — a quote or comma is off (the last line must not end in a comma). Click Copy accounts.json above and run the 3c command again.

An account still shows the bank's long name, and the NEW ACCOUNTS FOUND block is back — its id in accounts.json doesn't match exactly. Paste the block into the shortcut box above rather than retyping.

Step 4

Build kit.json — your plan

The one file that holds what you expect to happen. today.html walks it forward from your real balance.

What it does. kit.json tells the page which account is your checking, which bills land on fixed days, roughly what a day costs, which deposits you know are coming, and one or two what-ifs. From that it draws a five-month projection next to the actual balance. Rough numbers are fine — you'll tune them as the weeks go by, and the page always shows the bank's real balance beside the guess.

This form is for the first pass. It writes a complete, well-formed kit.json so you never have to fight a missing comma. After that, edit the file directly — open -t ~/git/cash-kit/kit.json — because Copy and Download here always write the whole file from this form and would overwrite anything you changed by hand. Two sections the form leaves at their defaults, for hand-editing later if you want them: recurring_income ({"start": "YYYY-MM-DD", "weekly_amount": 500, "count": 12, "label": "…"} — count is how many weeks; leave the list empty or use "count": 0 for none) and transfer_patterns (lowercase snippets that mark transfers and card payments so the calendar doesn't count them as spending; sensible defaults are built in).
Rent, insurance, phone, two paychecks, one what-if, one card, one milestone. Overwrites what's in the form.

4a — Basics

Must match a name from Step 3 exactly (capitals and spaces count). This is the account the projection follows.

4b — Monthly bills on fixed days

Rent or mortgage, insurance, phone, utilities on autopay. Day of month 1–31; amount as a plain number (positive; it is subtracted). A bill on day 29, 30, or 31 lands on the last day of shorter months.

DayAmountLabel

4c — Daily estimates

Add up a month of streaming, apps, memberships; divide by 30. Default 5.00.
Groceries, gas, coffee, the odd Amazon box. Default 40.00. Tune it after a month of real data.

4d — Money you know is coming

Paychecks, pension, Social Security, a tax refund — with the date it lands. The page adds them on that day.

DateAmountLabel

4e — What-if scenarios

Each scenario is a line on the chart. A with no events is "nothing unusual happens". Add events to B to see what a big purchase, a payoff, or a windfall does. Negative amount = money out, positive = money in.

DateAmount (− = out)Label
DateAmount (− = out)Label

4f — Credit cards on autopay

If a card pulls its minimum from checking on a fixed day, the projection should know. Each card also gets its own balance card on the page. Day 29–31 lands on the last day of shorter months.

Card account nameAutopay dayMinimum payment
The name must match a Step 3 name for its card to appear; the autopay is projected either way.

4g — Milestones

Dates worth seeing on the chart: a trip, a renewal, the end of the year. Each one is a dashed vertical with the emoji on top.

DateEmojiLabel
Emoji is optional; a pin is used if you leave it blank. On a Mac, ⌃ ⌘ space opens the emoji picker.

4h — Things not on any feed (estimates)

A pension value, a house, a private loan, cash in a drawer. They count toward net worth on the page and nothing else. Negative = a debt.

NameBalance
Use a name that isn't one of your Step 3 accounts.

4i — Optional: a savings floor to watch

A balance you don't want to dip below. The page shows a card that says intact or BELOW floor.

More optional settings: calendar accounts, horizon, ledger anchor

Accounts that count as spending on the calendar

Comma-separated names from Step 3. Blank means every account, which is usually right to start.

How far ahead to project

Days. Default 150 (about five months).

Ledger anchor — optional, only if you are importing an older ledger

Leave both blank. The chart keeps its full history on its own: after a monthly ingest (Step 7) the feed files are archived, and today.html still reads them. The anchor exists only for someone bringing in a ledger/transactions.csv from somewhere else: the date of its last row, and what checking showed that day, so the chart can draw back to January 1 from it.

4j — Export kit.json

Fill in the basics
What will be written

  

4k — Save it into the kit folder, then check it

After Copy. The second half asks Python to read the file back; it prints OK if the file is well-formed.

Terminal
pbpaste > ~/git/cash-kit/kit.json && /usr/bin/python3 -m json.tool ~/git/cash-kit/kit.json > /dev/null && echo OK
What good looks like
OK

If you used Download: mv ~/Downloads/kit.json ~/git/cash-kit/

If it goes wrong: anything other than OK means the clipboard didn't hold the file — click Copy kit.json again and re-run the command.

Changing your mind later. Open the file and edit it in place — open -t ~/git/cash-kit/kit.json — then ./cash-kit today to see the result. Dates are YYYY-MM-DD, amounts are plain numbers, every row keeps its brackets. Come back to this form only to start over: Copy here rewrites the whole file and drops any hand edits.

The worked example, as a finished kit.json

  
Step 5

Render your pages

Turns the feed plus your plan into today.html, spend-calendar.html, ledger.html and cards.html.

What it does. today reads the latest balances and transactions in ledger/inbox/ and your kit.json, and writes today.html: live balances with a small trend line per account, net worth, and the actual-versus-projected checking chart with your scenarios. open shows it in your browser. calendar writes the spending heat calendar.

5a — today.html

Terminal
cd ~/git/cash-kit
./cash-kit today
./cash-kit open
What good looks like
today.html written — net worth $15,534, effective Checking $4,812.55, stale_days=0, scenario lows A=1,204, B=-2,996
…and your browser opens the page.

On the chart: the solid dark line is your real checking balance; the dashed lines are the scenarios walking forward; dashed verticals with an emoji are your milestones. Mouse wheel zooms time around the cursor, drag pans, double-click resets. A scenario that "goes negative" is the page telling you something before the bank does. A scenario outflow whose date has already passed doesn't vanish — it rolls forward to the next day, because an obligation doesn't evaporate when a date slips.

5b — spend-calendar.html

Terminal
cd ~/git/cash-kit
./cash-kit calendar && open spend-calendar.html
What good looks like
spend-calendar.html written: 31 active days in 2026, out $3,412, in $5,200

Newest month on top, today ringed in gold. The switch at the top shows money out, money in, or both on one grid. Transfers and card payments never count in either direction.

5c — ledger.html and cards.html

Terminal
cd ~/git/cash-kit
./cash-kit ledger && ./cash-kit cards && open ledger.html cards.html

The ledger is every transaction on one page — search, filter by account, category or card, sort, month subtotals. Cards are buckets you name: a trip, a project, the business. Copy cards.example.json to cards.json, give each card a name and a few match words (bits of payee names); rows that match land on the card by themselves, and the + on any ledger row puts one there by hand (in the app that saves at once; in a plain browser it's remembered by that browser). Each card's page adds it up: money out and in, a budget bar, a calendar of its days, a chart of the running net with one dotted line per category, and by-category / by-payee / by-month tables. In the app the cards are the Board: each is a post-it with its numbers; click it for the full page.

A receipt the feed never delivered? Put it in ledger/inbox/<date>-reported.csv (same columns as transactions.csv). It shows everywhere marked reported and ingest promotes it — until the bank delivers a row with the same account and amount within −3/+21 days, when the bank's row wins.

Plans (the scenarios in kit.json) are the dashed lines on the chart. In the app the Plans tab shows the chart above one card per plan with its lowest point and end number, and the steps as plain rows — change one and the chart redraws.

If it goes wrong:

balances file has no 'Checking' row — check accounts.json mapping / kit.json checking_account — the Checking account name in kit.json isn't exactly one of the right-hand names in accounts.json. Make them identical (Step 3 or Step 4), save, and run today again.

two feed accounts share the same name in accounts.json — two ids map to the same right-hand name. Give each its own name, save accounts.json, then ./cash-kit pull --fresh.

kit.json not found at … — Step 4k didn't land; re-run its command.

kit.json has a JSON error at line N column M — a hand edit broke the file at that line (usually a missing comma or bracket). Fix that line, or re-export from Step 4j if you'd rather start clean. The Step 4k check (/usr/bin/python3 -m json.tool kit.json) points at the same spot; no need to paste the file into a website.

cash-kit today: a value in kit.json or accounts.json is the wrong shape — a date isn't YYYY-MM-DD, an amount has a $ or a comma in it, or a row is missing a field. Compare the row against kit.example.json.

no simplefin balances file in ledger/inbox — nothing has been pulled yet; back to Step 3.

A red feed is N day(s) stale band on the page — the checking balance date is older than today. Usually the bank's connection is running a day behind and it clears by the next morning. If it keeps climbing, the bank has asked for a fresh login: sign in at https://beta-bridge.simplefin.org/auth/login and relink that institution. Some institutions refresh slowly by design — Apple Card updates about once a month, so its sparkline sits flat for weeks; that's normal.

Step 6

Automate — every morning at 9:15

macOS's own scheduler (launchd) runs pull + today + calendar daily. No extra software.

What it does. install writes one small file into ~/Library/LaunchAgents/ that tells macOS to run ./cash-kit morning at 9:15 each day. morning is just pull, then today, then calendar. Output goes to ledger/inbox/morning.log. It's safe to run install again any time; it replaces the previous copy.

Terminal
cd ~/git/cash-kit
./cash-kit install
What good looks like
installed: com.cash-kit.morning runs './cash-kit morning' daily at 9:15 (log: ledger/inbox/morning.log)
remove with: launchctl bootout gui/$(id -u)/com.cash-kit.morning && rm '/Users/you/Library/LaunchAgents/com.cash-kit.morning.plist'

macOS may show a notification that a background item was added. That's this. Confirm it's registered:

Terminal
launchctl list | grep cash-kit
What good looks like
-	0	com.cash-kit.morning

Your Mac needs to be on at 9:15 — asleep is fine; macOS runs the job when it wakes. If it was shut down, that day is skipped; just run ./cash-kit morning yourself, or open today.html and read yesterday's.

To turn it off

Terminal
launchctl bootout gui/$(id -u)/com.cash-kit.morning && rm ~/Library/LaunchAgents/com.cash-kit.morning.plist

Nothing else changes — your files and your access key stay put. Run ./cash-kit install to turn it back on.

If it goes wrong: if tomorrow's page looks unchanged, read the log with tail -30 ~/git/cash-kit/ledger/inbox/morning.log — it shows the same messages you'd see running the commands by hand, so the fixes in Steps 3–5 apply. You can also always run ./cash-kit morning yourself.
Step 7

Once a month — make the ledger durable

The daily feed is provisional. ingest promotes it into one permanent, tidy file.

What it does. The daily pulls pile up dated files in ledger/inbox/. ingest takes every posted row (pending ones wait), removes duplicates, appends them to ledger/transactions.csv in date order, and moves the consumed inbox files into ledger/imports/. today.html keeps reading those archived files, so the chart loses no history when you ingest. Run it once a month, or whenever you like; it's safe to repeat.

The category column in the ledger is mostly left blank for you. ingest already tags obvious transfer legs and card payments as Transfer; the calendar skips rows categorised Transfer or CC Payment so shuffling money between your own accounts doesn't count as spending. If you fill in categories, do it in a text editor — open -t ~/git/cash-kit/ledger/transactions.csv — not Numbers or Excel, which rewrite the date column when they save.

7a — Preview, then do it

Terminal
cd ~/git/cash-kit
./cash-kit ingest --dry-run
What good looks like
  2026-08-05     -112.40  Checking                 SAFEWAY #1234
  2026-08-05      -14.99  Visa                     NETFLIX.COM
  …
208 new row(s) would be added
Terminal
cd ~/git/cash-kit
./cash-kit ingest
What good looks like
ledger: 208 row(s) total, 208 added; 1 inbox file(s) archived to ledger/imports/

7b — Only if you are bringing in an older ledger

Most people skip this. If you already keep a transactions file from somewhere else, you can make it the ledger: save it as ~/git/cash-kit/ledger/transactions.csv with the columns date,amount,payee,account,category,source (dates YYYY-MM-DD, money out negative, account names as in Step 3), then set the Ledger anchor in Step 4's optional settings to the date of its last row and what checking showed that day. That lets the chart draw back to January 1 from your file. Otherwise ledger_anchor stays null and everything still works.

If it goes wrong: 0 new row(s) right after a pull usually just means the feed was all pending or already in the ledger. ingest only reads files named *-simplefin.csv in ledger/inbox/; if that folder is empty, there's nothing to do until tomorrow's pull.
Reference

Where everything lives, and what stays out of git

The folder holds the tool. Your money lives in files the tool is told to ignore.

PathWhat it isGit
~/.config/cash-kit/simplefin_access_urlYour access key (the claimed token). Readable by your user only. The one thing that must never be shared.outside the folder
~/.config/cash-kit/simplefin_state.jsonWhich transactions the kit has already seen, plus when it last pulled. Do not delete it by hand — the next pull would write rows the inbox already holds. ./cash-kit pull --fresh is the reset; it clears this file and the inbox feed files together.outside the folder
ledger/inbox/The daily feed: YYYY-MM-DD-simplefin.csv (transactions), -balances.csv, -holdings.csv for brokerage accounts, plus morning.log. The Bridge's raw JSON reply is kept only if you run pull --raw.ignored
ledger/imports/Feed files already folded into the ledger by ingest.ignored
ledger/transactions.csvThe durable ledger. One row per posted transaction, all accounts, in date order.ignored
accounts.json · kit.jsonYour account names and your plan (Steps 3 and 4).ignored
today.html · spend-calendar.htmlThe pages. Regenerated every morning.ignored
cash-kit · bin/ · install.sh · setup.htmlThe tool itself, plus this worksheet.tracked

Why. .gitignore names every file that contains your numbers. If you ever back this folder up with git, or hand the folder to someone else, the tool travels and the money doesn't — and the access key was never inside the folder to begin with.

Backing up your data means copying two things: the whole ~/git/cash-kit folder (ledger/, kit.json and accounts.json all live in it) and ~/.config/cash-kit. Time Machine to a drive you own covers both. Keep the folder out of iCloud Drive, Dropbox, Google Drive and the like — it is local only, always. Open it in Finder any time with open ~/git/cash-kit.

Editing the ledger by hand — ledger/transactions.csv is plain text; open it with a text editor (open -t, BBEdit, VS Code). Numbers and Excel will rewrite the date column when they save, and the kit will stop understanding it.

Reference

Every message the kit can print, and the fix

The same fixes as in the steps above, in one place for later.

MessageWhat to do
no access URL configuredNothing has been claimed yet. ./cash-kit claim (Step 2c).
HTTP 403 — access token rejectedMake a new Setup Token at beta-bridge.simplefin.org/simplefin/create and claim again.
claim failed: HTTP 4xx — setup tokens are single-useThat token was used or expired. New token, claim again.
setup token is not valid base64The paste picked up a stray space or line break, or missed a piece. New token at beta-bridge.simplefin.org/simplefin/create, claim again.
no token enteredReturn was pressed before pasting. ./cash-kit claim again and paste at the prompt.
that looks like an ACCESS url, not a setup tokenA link was copied instead of the token. The Setup Token is the long block of letters and numbers, no https:// in it.
WARNING: accounts.json is invalid JSON — ignoringA quote or comma is off (the last line must not end in a comma). Copy accounts.json from Step 3b again and run the 3c command, then ./cash-kit pull --fresh.
token is valid, but NO banks are connected yetLink your institutions at beta-bridge.simplefin.org/auth/login, then pull again.
NEW ACCOUNTS FOUND (on a later pull)An id is missing from accounts.json. Add it, then ./cash-kit pull --fresh.
balances file has no 'X' rowMake checking_account in kit.json identical to one of the names in accounts.json.
two feed accounts share the same nameGive each id its own name in accounts.json, then ./cash-kit pull --fresh.
kit.json has a JSON error at line …Fix that line, or re-export from Step 4j. The Step 4k check points at the same spot; no need to paste the file into a website.
kit.json not found at …Step 4k didn't land; re-run its command (or cp kit.example.json kit.json and edit by hand).
ledger_anchor is set but ledger/transactions.csv does not existEither run ./cash-kit ingest (Step 7) or set ledger_anchor back to null; the page renders from the feed window meanwhile.
only the first 3 scenarios are drawnkit.json has more than three scenarios; the extras are ignored, not an error.
a value in kit.json or accounts.json is the wrong shapeDates are YYYY-MM-DD; amounts are plain numbers, no $ or commas; every row has all its fields.
no simplefin balances file in ledger/inboxPull first: ./cash-kit pull.
answered with a redirect — refusing to forward credentialsBy design: the kit won't follow a redirect with your key attached. If SimpleFIN has genuinely moved, claim a fresh token.
Red feed is N day(s) stale bandThe bank's connection at the Bridge is behind. Usually clears next morning; if it keeps climbing, sign in at the Bridge and relink that institution. Apple Card refreshes monthly, which is normal.
The 9:15 job didn't runlaunchctl list | grep cash-kit should show com.cash-kit.morning; if not, ./cash-kit install again. If it is listed, read ledger/inbox/morning.log.

This worksheet

Everything above is saved in this browser's storage, on this Mac: the checkmarks, the account names, the kit.json form. None of it is secret, and none of it goes anywhere.